package com.jungle.sp.daily.util;


import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

public class JsonSortUtils {

    /**
     * 对JSONObject的key根据首字母排序 若首字母相同对比下一个字母 依次类推
     *
     * @param json
     * @return 排序后的新json
     */
    public static JSONObject startSort(JSONObject json) {
        // 第1层
        JSONObject jsonAlone = getAloneKeys(json);
        // 第2-n层
        for (String key : jsonAlone.keySet()) {
            Object value = jsonAlone.get(key);
            if(value.getClass().isPrimitive() || value instanceof String){
                //基本数据类型 || 字符串
                jsonAlone.put(key,value);
            }else {
                Object object = JSON.parse(JSON.toJSONString(value));
                if (object instanceof JSONObject) {
                    jsonAlone.put(key, getAloneKeysRec((JSONObject) object));
                }
                if (object instanceof JSONArray){
                    jsonAlone.put(key, getAloneKeysRec((JSONArray) object));
                }
            }

        }
        return jsonAlone;
    }

    private static JSONArray getAloneKeysRec(JSONArray json){
        JSONArray jsonAlone = new JSONArray();
        for(Object value : json){
            if(value.getClass().isPrimitive() || value instanceof String){
                //基本数据类型 || 字符串
                jsonAlone.add(value);
            }else {
                if (value instanceof JSONObject) {
                    jsonAlone.add(getAloneKeysRec((JSONObject)value));
                }else if (value instanceof JSONArray){
                    jsonAlone.add(getAloneKeysRec((JSONArray)value));
                }
            }
        }
        return jsonAlone;
    }


    /**
     * 递归每一层（当前是判断下一层是JSONObject类型的场景）
     *
     * @param json
     * @return
     */
    private static JSONObject getAloneKeysRec(JSONObject json) {
        JSONObject newJson = getAloneKeys(json);
        for (Map.Entry<String, Object> entry : newJson.entrySet()) {
            // JSONObject类型
            if (entry.getValue().getClass().equals(JSONObject.class)) {
                newJson.put(entry.getKey(), getAloneKeysRec((JSONObject) entry.getValue()));
            }
        }

        return newJson;
    }

    /**
     * 对单层json排序
     *
     * @param json
     */
    private static JSONObject getAloneKeys(JSONObject json) {
        ArrayList<String> aloneKeys = new ArrayList<>();
        for (String key : json.keySet()) {
            aloneKeys.add(key);
        }
        // 排序
        Collections.sort(aloneKeys);
        // 整理排序后的json
        JSONObject newJson = new JSONObject(new LinkedHashMap<>());
        for (String key : aloneKeys) {
            newJson.put(key, json.get(key));
        }
        return newJson;
    }
}